#ifndef PLANSTORAGE_H
#define PLANSTORAGE_H

#include "PlanTask.h"
#include <QList>
#include <QDate>
#include <QString>
#include <functional>
#include "module_global.h"
/**
 * @brief 日计划数据存储类
 * 负责将任务数据存储到 JSON 文件中，文件路径格式：YYYY/MM/DD/tasks.json
 */
class MODULE_EXPORT PlanStorage
{
public:
    PlanStorage();
    
    /**
     * @brief 设置存储根目录
     * @param basePath 根目录路径（默认为程序运行目录下的 plans/）
     */
    void setBasePath(const QString& basePath);
    
    /**
     * @brief 获取指定日期的所有任务
     * @param date 日期
     * @return 任务列表
     */
    QList<PlanTask> loadTasks(const QDate& date);
    
    /**
     * @brief 获取日期范围内的所有任务
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 任务列表
     */
    QList<PlanTask> loadTasksInRange(const QDate& startDate, const QDate& endDate);

    /**
     * @brief [FDD-2025-03-021][API-003] 流式遍历日期范围内的任务
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param callback 任务回调函数，返回false时中断遍历
     * @return 是否成功完成遍历
     */
    bool forEachTask(const QDate& startDate, const QDate& endDate,
                     std::function<bool(const PlanTask&)> callback);
    
    /**
     * @brief 保存指定日期的任务列表
     * @param date 日期
     * @param tasks 任务列表
     * @return 是否成功
     */
    bool saveTasks(const QDate& date, const QList<PlanTask>& tasks);
    
    /**
     * @brief 添加或更新单个任务
     * @param task 任务对象
     * @return 是否成功
     */
    bool saveTask(const PlanTask& task);
    
    /**
     * @brief 删除指定任务
     * @param taskId 任务ID
     * @param date 任务所属日期
     * @return 是否成功
     */
    bool deleteTask(const QString& taskId, const QDate& date);
    
    /**
     * @brief 获取指定日期的文件路径
     * @param date 日期
     * @return 完整文件路径
     */
    QString getFilePath(const QDate& date) const;
    
private:
    /**
     * @brief 确保目录存在
     * @param dirPath 目录路径
     * @return 是否成功
     */
    bool ensureDirectoryExists(const QString& dirPath);
    
    /**
     * @brief 从JSON文件加载任务
     * @param filePath 文件路径
     * @return 任务列表
     */
    QList<PlanTask> loadFromFile(const QString& filePath);
    
    /**
     * @brief 保存任务到JSON文件
     * @param filePath 文件路径
     * @param tasks 任务列表
     * @return 是否成功
     */
    bool saveToFile(const QString& filePath, const QList<PlanTask>& tasks);
    
private:
    QString m_basePath;  // 存储根目录
};

#endif // PLANSTORAGE_H

